<?php

/**
 * 
 * Autor				: 	Juan Jose Muñiz Juarez
 * Fecha de Creacion	: 	01/05/2012,  16:57:59
 * Version 				: 	1.0
 * Descripcion 			:
 */

if ( !defined ( "RUTA_FISICA_SISTEMA" ) )
   {
      require_once "../../../config/Constantes.php";
   }

$ruta_sistema = RUTA_FISICA_SISTEMA . "/sistema/";

require_once $ruta_sistema . "general/clases/comun/base_datos/ORMMySQL.php";
require_once $ruta_sistema . "general/clases/comun/base_datos/DataBaseMySQL.php";
require_once $ruta_sistema . "general/clases/comun/ConfiguracionGeneral.php";


class GeneralORM
   {
      private static $_motor;
      private static $_bd;

      /**
       * 
       * Nombre         : 	getORM
       * Descripción   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora	:	15/05/2012, 18:28:28
       * params: 
       * return: return_type
       */
      public static function getORM( $objeto = null )
         {   
            $base_datos = self :: getMotorORM();
            
            switch ( $base_datos )
               {
                  case ORM_ENGINE_MYSQL ; // 1 = Mysql
                     {
                        if ( !self :: $_motor )
                           {
                              self :: $_motor = new ORMMySQL ( objeto);                                 
                           }
                        break;
                     }
                  case ORM_ENGINE_SQLSERVER ; // 2 = Sql Server
                     {
                        break;
                     }
               }    
              
            return self :: $_motor; 
         }
         
         /**
          * 
          * Nombre         : 	getORMBaseDatos
          * Descripción    :	
          * Version 	   :  	1.0
          * Autor:		   :	Juan Jose Muñiz Juarez
          * Fecha y Hora   :	16/05/2012, 15:18:30
          * params: 
          * return: return_type
          */
       public static function getORMBaseDatos( $class = null, $method = null, $line = null )
         {
            if ( !self :: $_bd )
              {
                  $base_datos = self :: getMotorORM();
                  
                  if ( !$base_datos )
                    {
                       $base_datos = 1; // MYSQL
                    }
                    
                  switch ( $base_datos )
                    {
                       case ORM_ENGINE_MYSQL:
                          {
                             self :: $_bd = new DataBaseMySQL( $class, $method, $line );
                             break;
                          }
                    }  
              }
              
              return self :: $_bd;
         }  

         /**
          * 
          * Nombre         : 	getMotorORM
          * Descripción   	:  Devuelve el tipo de motor que se utilizara en la base de datos  	
          * Version 			:  	1.0
          * Autor:			:	Juan Jose Muñiz Juarez
          * Fecha y Hora		:	16/05/2012, 15:12:56
          * params: @return Ambigous <number, string>
          * return: Ambigous <number, string>
          */
       private static function getMotorORM()
         {
             $base_datos = 1; // POR DEFAULT MYSQL
                    
             if ( defined ( "ORM_ENGINE_DATABASE" ) )
               {
                 $base_datos = ORM_ENGINE_DATABASE;
               }
               

             return $base_datos;
         }  
         

      /**
       * 
       * Nombre         : 	getTabla
       * Descripcion   	:	
       * Version 		:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora	:	01/05/2012, 17:00:42
       * @param  $objeto Admite el nombre del archivo .xml de la configuracion o un objeto de una clase
       */
      public static function getTabla($objeto)
         {
            // Verificamos de donde se va a obtener el nombre de la tabla           
            if ( ConfiguracionGeneral::get( "ORM_OBTENER_INFO_COMENTARIO" ) == "1" )
               {                  
                  $tabla = self :: getObtenerInfoComentario ( self :: getInfoComentario ( $objeto ), "@tabla" );
                  // var_dump( $tabla );
                  $tabla = self :: eliminarCaracteresCampoComentario ( $tabla );
                  // var_dump( $tabla );

                  return $tabla;
               }
         }

      /**
       * 
       * Nombre         	: 	getCampos
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 18:05:57
       * @param unknown_type $objeto
       * @return Ambigous <string, unknown>
       */
      public static function getCampos($objeto)
         {
            // Verificamos de donde se va a obtener el nombre de la tabla
            if ( ConfiguracionGeneral::get( "ORM_OBTENER_INFO_COMENTARIO" ) == "1" )
               {
                  $campos = self :: getInfoComentario ( $objeto, "", false );
                  //var_dump( $campos );

                  if ( $campos )
                     {
                        $campos_info = array ( );

                        foreach ( $campos as $campo )
                           {
                              // Ahora obtenemos los comentarios de cada campo
                              $comentario = self :: getInfoComentario ( $objeto, $campo -> getName ( ), false );

                              if ( $comentario )
                                 {
                                    $informacion_campos = array ( );

                                    $informacion_campos [ "columna" ] = self :: getInformacionCampoComentario ( $comentario, "@columna" );
                                    $informacion_campos [ "tipo" ] = self :: getInformacionCampoComentario ( $comentario, "@tipo" );
                                    $informacion_campos [ "id" ] = self :: getInformacionCampoComentario ( $comentario, "@id" );
                                    $informacion_campos [ "autoincrement" ] = self :: getInformacionCampoComentario ( $comentario, "@autoincrement" );
                                    $informacion_campos [ "default" ] = self :: getInformacionCampoComentario ( $comentario, "@default" );

                                    //var_dump( $informacion_campos[ "autoincrement" ] );

                                    $campos_info [ $campo -> getName ( ) ] = $informacion_campos;
                                 }
                           }

                        return $campos_info;
                     }
                    
               }

            return array ( );
         }

      /**
       * 
       * Nombre         	: 	getCampoId
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 22:12:35
       * @param unknown_type $objeto
       * @param unknown_type $campo
       * @return multitype:multitype:Ambigous Ambigous <Ambigous, string, unknown_type, unknown>  |multitype:
       */
      public static function getCampoId($objeto)
         {
            // Verificamos de donde se va a obtener el nombre de la tabla
            if ( ConfiguracionGeneral::get( "ORM_OBTENER_INFO_COMENTARIO" ) == "1" )
               {                 
                  $campos = self :: getInfoComentario ( $objeto, "", false );
                  //var_dump( $campos );

                  if ( $campos )
                     {
                        $campos_info = array ( );

                        foreach ( $campos as $campo )
                           {
                              // Ahora obtenemos los comentarios de cada campo
                              $comentario = self :: getInfoComentario ( $objeto, $campo -> getName ( ), false );

                              if ( $comentario )
                                 {
                                    $informacion_campos = array ( );

                                    $id = self :: getInformacionCampoComentario ( $comentario, "@id" );

                                    if ( $id == 1 )
                                       {
                                          return self :: getInformacionCampoComentario ( $comentario, "@columna" );
                                       }
                                 }
                           }
                     }
                     
               }

            return null;
         }

      /**
       * 
       * Nombre         	: 	getInformacionCampoComentario
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 18:20:39
       * @param String $comentario
       * @param String $campo
       * @return Ambigous <string, unknown>
       */
      private function getInformacionCampoComentario($comentario, $campo)
         {
            // var_dump( $campo );
            $valor = self :: getObtenerInfoComentario ( $comentario, $campo );
            //var_dump( $valor );
            $valor = self :: eliminarCaracteresCampoComentario ( $valor );
            //var_dump( $valor );
            return $valor;
         }
      /**
       * 
       * Nombre         	: 	getInfoComentario
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 17:06:38
       * @param unknown_type $objeto
       * @param unknown_type $campo
       * @param unknown_type $clase
       * @return string|ReflectionProperty|multitype:
       */
      private static function getInfoComentario($objeto, $campo = "", $clase = true)
         {
            if ( !$objeto )
               {

               }

            if ( $clase )
               {
                  $reflection = new ReflectionClass ( $objeto);

                  if ( $reflection )
                     {
                        return $reflection -> getDocComment ( );
                     }
               }
            else
               {
                  $reflection = new ReflectionObject ( $objeto);

                  if ( $reflection )
                     {
                        if ( $campo )
                           {
                              return $reflection -> getProperty ( $campo ) -> getDocComment ( );
                           }
                        else
                           {
                              return $reflection -> getProperties ( );
                           }
                     }
               }

            return "";
         }

      /**
       * 
       * Nombre         	: 	getObtenerInfoComentario
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 17:19:09
       * @param unknown_type $campo_buscar Campo que se desea obtener del comentario
       */
      public static function getObtenerInfoComentario($comentario, $campo_buscar)
         {
            if ( !$comentario && !$campo_buscar )
               {

               }

            if ( strpos ( $comentario, $campo_buscar ) !== false )
               {
                  $cadena = stristr ( $comentario, $campo_buscar );

                  if ( $cadena )
                     {
                        $posicion = strpos ( $cadena, PHP_EOL );

                        if ( !$posicion )
                           {
                              $posicion = strpos ( $cadena, " " );
                           }

                        if ( !$posicion )
                           {
                              $posicion = strlen ( $cadena );
                           }

                        $cadena = substr ( $cadena, 0, $posicion );

                        return $cadena;
                     }
               }

            return "";
         }

      /**
       * 
       * Nombre         	: 	eliminarCaracteresCampoComentario
       * Descripcion   	:	Permite eliminar los caracteres que agrupen al valor del campo, devolviendo solo el valor deseado
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 17:41:13
       * @param unknown_type $campo
       * @param unknown_type $caracteres_eliminar
       */
      private static function eliminarCaracteresCampoComentario($campo, $caracteres_eliminar = "()\"'-=")
         {
            if ( !$campo )
               {

               }

            if ( strpos ( $campo, "=" ) !== false )
               {
                  list($nombre, $valor) = explode ( "=", $campo );

                  if ( $valor )
                     {
                        $info = str_split ( $valor );
                        $valor = "";

                        foreach ( $info as $caracter )
                           {
                              if ( strpos ( $caracteres_eliminar, $caracter ) !== false )
                                 {
                                    continue;
                                 }

                              $valor .= $caracter;
                           }

                        return $valor;
                     }
                  else
                     {
                        return $campo;
                     }
               }

            return "";
         }

      /**
       * 
       * Nombre         	: 	getMetodo
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 19:34:43
       * @param unknown_type $objeto
       * @param unknown_type $metodo
       */
      public static function getMetodo($objeto, $metodo)
         {
            if ( !$metodo && !$objeto )
               {

               }

            $reflection = new ReflectionObject ( $objeto);

            return $reflection -> getMethod ( $metodo );
         }

      /**
       * 
       * Nombre         	: 	getMetodos
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 19:36:12
       * @param unknown_type $objeto
       * @return object
       */
      public static function getMetodos($objeto)
         {
            if ( !$objeto )
               {

               }

            $reflection = new ReflectionObject ( $objeto);

            return $reflection -> getMethods ( );
         }

      /**
       * 
       * Nombre         	: 	setValorObjeto
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 19:37:35
       * @param unknown_type $objeto
       * @param unknown_type $metodo
       * @param unknown_type $valor
       */
      public static function setValorObjeto($objeto, $metodo, $valor)
         {
            $metodo = self :: getMetodo ( $objeto, $metodo );

            if ( $metodo )
               {
                  //var_dump( $metodo -> getName() );
                  return call_user_func ( array ( $objeto, $metodo -> getName ( ) ), $valor );
               }

            return null;
         }

      /**
       * 
       * Nombre         	: 	getValorObjeto
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	01/05/2012, 19:39:00
       * @param unknown_type $objeto
       * @param unknown_type $metodo
       * @return NULL
       */
      public static function getValorObjeto($objeto, $metodo)
         {
            $metodo = self :: getMetodo ( $objeto, $metodo );

            if ( $metodo )
               {
                  //var_dump( $metodo -> getName() );
                  return call_user_func ( array ( $objeto, $metodo -> getName ( ) ) );
               }

            return null;
         }

      /**
       * 
       * Nombre         	: 	generarNombreClase
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	06/05/2012, 19:01:32
       * @param unknown_type $nombre_clase
       * @return mixed
       */
      public static function generarNombreClase($nombre_clase)
         {
            return ConfiguracionGeneral::get( "ORM_PREFIJO_CLASE" ) . str_replace ( " ", "", ucwords ( str_replace ( "_", " ", $nombre_clase ) ) );
         }

      /**
       * 
       * Nombre         	: 	generarNombreModelo
       * Descripcion   	:	
       * Version 			:  	1.0
       * Autor:			:	Juan Jose Muñiz Juarez
       * Fecha y Hora		:	06/05/2012, 19:06:10
       * @param unknown_type $nombre_clase
       * @return string
       */
      public static function generarNombreModelo($nombre_clase)
         {
            return ConfiguracionGeneral::get( "ORM_PREFIJO_MODELO" ) . str_replace ( " ", "", ucwords ( str_replace ( "_", " ", $nombre_clase ) ) );
         }
   }
